﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DDD {

    /// <summary>
    /// アニメーション・イベント
    /// </summary>
    /// <remarks>
    /// アニメーションクリップには再生中に指定の時刻になるとコールバック関数を呼び出す機能があり、
    /// これをアニメーションイベントと呼びます。コールバック関数として指定できるのは
    /// <see cref="AnimationEventHandler"/>型の関数です。任意の引数を1つ渡せます。
    /// イベントの登録は<see cref="AnimationClip.AddEvent"/>で行います。
    /// ユーザーが<dic>AnimationEvent</dic>型を直接インスタンス化する事はできず、
    /// エンジン側で作成したものを戻り値として受け取ります。
    /// </remarks>
    public struct AnimationEvent {

        #region Constructor
        /// <summary>
        /// コンストラクター
        /// </summary>
        /// <param name="time">イベントの発生時刻(ローカル)</param>
        /// <param name="name">イベント名</param>
        /// <param name="handler">呼び出されるコールバック関数</param>
        /// <param name="args">コールバック関数に渡す任意の引数</param>
        internal AnimationEvent (float time, string name, AnimationEventHandler handler, object args)
            : this () {
            this.Time = time;
            this.Name = name;
            this.Handler = handler;
            this.Args = args;
        }
        #endregion

        #region Property
        /// <summary>
        /// イベントの発生時刻(ローカル)
        /// </summary>
        /// <value>イベントの発生時刻(ローカル)</value>
        public float Time { get; private set; }

        /// <summary>
        /// イベント名
        /// </summary>
        /// <value>イベント名は任意です。エンジン側では一切使用しません。</value>
        public string Name { get; private set; }

        /// <summary>
        /// コールバック関数
        /// </summary>
        /// <value>指定するコールバック関数は<see cref="AnimationEventHandler"/>型である必要があります。</value>
        public AnimationEventHandler Handler { get; private set; }

        /// <summary>
        /// コールバック関数に渡す引数
        /// </summary>
        /// <value>引数は任意です。エンジン側では一切使用しません。</value>
        public object Args { get; private set; }
        #endregion

        #region Method
        /// <summary>
        /// イベント情報を表示します
        /// </summary>
        /// <returns>イベント情報</returns>
        public override string ToString () {
            return string.Format ("AnimationEvent: Time={0}, Name={1}, Handler={2}, Args={3}", Time, Name, Handler, Args);
        }
        #endregion

    }
}
